/*
Copyright Scand LLC http://www.scbr.com
To use this component please contact info@scbr.com to obtain license
*/

/**
*   @desc: switch all default functionality to use CSV
*   @param: path - path to file
*   @type: private
*   @topic: 0
*/
dhtmlXGridObject.prototype.useCSV = function(path){
   if (!this._csv_loadXML){
      this._csv_loadXML=this.loadXML;
      this._csv_loadXMLString=this.loadXMLString;
      this.loadXML=this.loadCSVFile;
      this.loadXMLString=this.loadCSVFile;
   }
}


/**
*   @desc: load grid from CSV file
*   @param: path - path to file
*   @param: afterCall - function which will be called after xml loading
*   @type: public
*     @edition: Professional
*   @topic: 0
*/
dhtmlXGridObject.prototype.loadCSVFile = function(path,afterCall){
    this.xmlLoader = new dtmlXMLLoaderObject(this._onCSVFileLoad,this);
    this.xmlLoader.waitCall=afterCall;
    this.xmlLoader.loadXML(path);
}
dhtmlXGridObject.prototype._onCSVFileLoad=function(obj,b,c,d,xml){
   var z=this.xmlDoc.responseText;
   obj.loadCSVString(z);
}

/**
*   @desc: enable mode, where ID for rows loaded from CSV autogenerated
*   @param: mode - true/false
*   @type: public
*   @edition: Professional
*   @topic: 0
*/
dhtmlXGridObject.prototype.enableCSVAutoID = function(mode){
   this._csvAID=convertStringToBoolean(mode);
}
/**
*   @desc: enable recognizing firs row in CSV as header
*   @param: mode - true/false
*   @type: public
*   @edition: Professional
*   @topic: 0
*/
dhtmlXGridObject.prototype.enableCSVHeader = function(mode){
   this._csvHdr=convertStringToBoolean(mode);
   if (this._csvHdr) this.enableCSVAutoID(true);
}

/**
*   @desc: load grid from CSV string
*   @param: str - delimer used in CSV operations, comma by default ( only single char delimeters allowed )
*   @type: public
*     @edition: Professional
*   @topic: 0
*/
dhtmlXGridObject.prototype.setCSVDelimiter = function(str){
   this._csvDelim=(str||this._csvDelim);
   this._csvDelimX=this._csvDelim.charCodeAt(0);
   var trans=[0,1,2,3,4,5,6,7,8,9,"A","B","C","D","E","F"];
   this._csvDelimX="\\x"+trans[Math.floor(this._csvDelimX/16)]+""+trans[(this._csvDelimX%16)];
}

/**
*   @desc: load grid from CSV string
*   @param: str - CSV  string
*   @type: public
*     @edition: Professional
*   @topic: 0
*/
dhtmlXGridObject.prototype.loadCSVString = function(str){
   if (!this._csvDelimX)  this.setCSVDelimiter();
   var r1=new RegExp("^([^"+this._csvDelimX+"]+)"+this._csvDelimX);
   var r2=new RegExp("\n([^"+this._csvDelimX+"]+)"+this._csvDelimX,"g");
   var r3=new RegExp(""+this._csvDelimX+"","g");
   if (this._csvHdr){
      hdr=str.substr(0,str.indexOf("\n"));
      str=str.substr(str.indexOf("\n")+1);
        hdr="<head><beforeInit><call command='setHeader'><param>"+hdr.replace(new RegExp(this._csvDelimX,"g"),",")+"</param></call><call command='init'></call></beforeInit></head>";
   }
   if (this._csvAID){
      str=str.replace(r1,"<row><cell><![CDATA[$1]]></cell><cell><![CDATA[");
      str=str.replace(r2,"]]></cell></row><row id=''><cell><![CDATA[$1]]></cell><cell><![CDATA[");
   }
   else{
      str=str.replace(r1,"<row id='$1'><cell><![CDATA[");
      str=str.replace(r2,"]]></cell></row><row id='$1'><cell><![CDATA[");
   }

   str=str.replace(r3,"]]></cell><cell><![CDATA[");
   if (str.indexOf("<row")!=0) str="<row><cell><![CDATA["+str;
   str="<?xml version='1.0'?><rows>"+(this._csvHdr?(hdr+str):str)+"]]></cell></row></rows>";
   this.xmlLoader = new dtmlXMLLoaderObject(this.doLoadDetails,window,true,this.no_cashe);
   this.xmlLoader.loadXMLString(str);
}

/**
*   @desc: serialize to CSV string
*   @type: public
*     @edition: Professional
*   @topic: 0
*/
dhtmlXGridObject.prototype.serializeToCSV = function(){
    this.editStop()
    if (this._mathSerialization)
         this._agetm="getMathValue";
    else this._agetm="getValue";

    var out="";
    if (this._csvHdr){
    	var a=[]; var b=this.hdr.rows[1].cells;
    	for (var i=0; i<b.length; i++)
			if ((!this._srClmn)||(this._srClmn[i]))
				a.push(b[i].childNodes[0].innerHTML);
    	out=a.join(this._csvDelim)+"\n";
    }
    
    //rows collection
    var i=0;
    var leni=(this._dload)?this.rowsBuffer[0].length:this.rowsCol.length;
   for(i; i<leni; i++){
      var r = this.rowsCol[i];
      var temp=this._serializeRowToCVS(r,i)
      out += temp;
      if (temp!="") out += "\n";
   }

   return out;
}

/**
*   @desc: serialize TR to CSV
*   @param: r - TR or xml node (row)
*   @retruns: string - CSV representation of passed row
*   @type: private
*/
dhtmlXGridObject.prototype._serializeRowToCVS = function(r,i,start,end){
    var out = new Array();

    start = start||0;
    end = end||r.childNodes.length;

    if ((!r)||(r._sRow)||(r._rLoad)) {
      if (this.rowsBuffer[1][i]){
         var r=this.rowsBuffer[1][i];
         if (!this._csvAID)
             out[out.length]=r.getAttribute("id");
         for (var j=0; j<r.childNodes.length; j++){
            if (r.childNodes[j].tagName=="cell"){
               var c=r.childNodes[j];
                out[out.length]=c.firstChild?c.firstChild.nodeValue:"";
            }                                     }

      }
        return out;
     }

   if (!this._csvAID)
       out[out.length]=r.idd;


    //cells
    var changeFl=false;
    for(var jj=start;jj<end;jj++)
        if ((!this._srClmn)||(this._srClmn[jj])){
            var cvx=r.childNodes[jj];

            var zx=this.cells(r.idd,cvx._cellIndex);
        /*	if (zx.getText)
        		zxVal=zx.getText();
        	else*/
            if (zx.cell)
                zxVal=zx[this._agetm]();
            else zxVal="";


          if ((this._chAttr)&&(zx.wasChanged()))
         changeFl=true;

            out[out.length]=((zxVal===null)?"":zxVal)
//#colspan:20092006{
            if ((this._ecspn)&&(cvx.colSpan)){
                cvx=cvx.colSpan-1;
                for (var u=0; u<cvx; u++)
                out[out.length] = "";
            }
//#}

         }
     if ((this._onlChAttr)&&(!changeFl)) return "";
      return out.join(this._csvDelim);
}

dhtmlXGridObject.prototype.toClipBoard=function(val){
    if (window.clipboardData)
      window.clipboardData.setData("Text",val);
   else
      (new Clipboard()).copy(val);

}
dhtmlXGridObject.prototype.fromClipBoard=function(){
   if (window.clipboardData)
      return window.clipboardData.getData("Text");
   else
      return (new Clipboard()).paste();
}

/**
*   @desc: copy value of cell to clipboard
*   @type: public
*   @param: rowId - id of row (optional, use selected row by default)
*   @param: cellInd - column index(optional, use selected cell by default)
*     @edition: Professional
*   @topic: 5
*/
dhtmlXGridObject.prototype.cellToClipboard = function(rowId,cellInd){
    if ((!rowId)||(!cellInd)){
       if (!this.selectedRows[0]) return;
       rowId=this.selectedRows[0].idd;
       cellInd=this.cell._cellIndex;
   }
   
   	var ed=this.cells(rowId,cellInd);
    this.toClipBoard(ed.getLabel?ed.getLabel():ed.getValue());
}

/**
*   @desc: set value of cell from clipboard
*   @type: public
*     @edition: Professional
*   @param: rowId - id of row (optional, use selected row by default)
*   @param: cellInd - column index(optional, use selected cell by default)
*   @topic: 5
*/
dhtmlXGridObject.prototype.updateCellFromClipboard = function(rowId,cellInd){
    if ((!rowId)||(!cellInd)){
       if (!this.selectedRows[0]) return;
       rowId=this.selectedRows[0].idd;
       cellInd=this.cell._cellIndex;
   }
   	var ed=this.cells(rowId,cellInd);
    ed[ed.setLabel?"setLabel":"setValue"](this.fromClipBoard());
}

/**
*   @desc: copy value of row to clipboard
*   @type: public
*     @edition: Professional
*   @param: rowId - id of row (optional, use selected row by default)
*   @topic: 5
*/
dhtmlXGridObject.prototype.rowToClipboard = function(rowId){
   var out="";
    if (this._mathSerialization)
         this._agetm="getMathValue";
    else this._agetm="getValue";
   if (rowId)
      out=this._serializeRowToCVS(this.getRowById(rowId));
   else
      for (var i=0; i<this.selectedRows.length; i++){
         if (out) out+="\n";
         out+=this._serializeRowToCVS(this.selectedRows[i]);
      }
   this.toClipBoard(out);
}

/**
*   @desc: set value of row from clipboard
*   @type: public
*     @edition: Professional
*   @param: rowId - id of row (optional, use selected row by default)
*   @topic: 5
*/
dhtmlXGridObject.prototype.updateRowFromClipboard = function(rowId){
   var csv=this.fromClipBoard();
   if (!csv) return;
   if (rowId)
      var r=this.getRowById(rowId);
   else
      var r=this.selectedRows[0];
   if (!r) return;
   csv=csv.split(this._csvDelim);
   for (var i=1; i<csv.length; i++){
   	  var ed=this.cells3(r,i-1);
	  ed[ed.setLabel?"setLabel":"setValue"](csv[i]);
	  }
}

/**
*   @desc: add new row from clipboard
*   @type: public
*     @edition: Professional
*   @topic: 5
*/
dhtmlXGridObject.prototype.addRowFromClipboard = function(){
   var csv=this.fromClipBoard();
   if (!csv) return;
   var z=csv.split("\n");
   for (var i=0; i<z.length; i++)
      if (z[i]){
         csv=z[i].split(this._csvDelim);
         this.addRow(csv[0],csv.slice(1));
      }
}

/**
*   @desc: copy CVS representation of grid to clipboard
*   @type: public
*     @edition: Professional
*   @topic: 5
*/
dhtmlXGridObject.prototype.gridToClipboard = function(){
   this.toClipBoard(this.serializeToCSV());
}

/**
*   @desc: init grid from CSV representation stored in clipboard
*   @type: public
*     @edition: Professional
*   @topic: 5
*/
dhtmlXGridObject.prototype.gridFromClipboard = function(){
   var csv=this.fromClipBoard();
   if (!csv) return;
   this.loadCSVString(csv);
}

/**
*   @desc: get grid as XML - php required
*   @param: path - path to server side code,optional
*   @type: private
*   @edition: Professional
*   @topic: 5
*/
dhtmlXGridObject.prototype.getXLS = function(path){
   if (!this.xslform){
      this.xslform=document.createElement("FORM");
      this.xslform.action=(path||"")+"xls.php";
      this.xslform.method="post";
      this.xslform.target=(_isIE?"_blank":"");
      document.body.appendChild(this.xslform);
      var i1=document.createElement("INPUT");
      i1.type="hidden";
      i1.name="csv";
      this.xslform.appendChild(i1);
      var i2=document.createElement("INPUT");
      i2.type="hidden";
      i2.name="csv_header";
      this.xslform.appendChild(i2);
   }
      var cvs = this.serializeToCSV();
      this.xslform.childNodes[0].value = cvs;
        var cvs_header = [];
        var l = this._cCount;
        for (var i=0; i<l; i++) {
         cvs_header.push(this.getHeaderCol(i));
        }
      cvs_header = cvs_header.join(',');
      this.xslform.childNodes[1].value = cvs_header;
       this.xslform.submit();
}

/**
*   @desc: generate print friendly view
*   @type: public
*   @edition: Professional
*   @topic: 5
*/
dhtmlXGridObject.prototype.printView = function(path){
	  var html="<style>TD { font-family:Arial; text-align:center;} </style>";
	   html+="<base  href='"+document.location.href+"'></base>";
       html += '<table width="100%" border="2px" cellpadding="0" cellspacing="0">';
       var row_length = this.rowsCol.length;
       var col_length = this._cCount;
      var width = this._printWidth();
      html += '<tr>';
        for (var i=0; i<col_length; i++) {
         var colspan=(this.hdr.rows[1].cells[this.hdr.rows[1]._childIndexes?this.hdr.rows[1]._childIndexes[parseInt(i)]:i].colSpan||1);
         for (var j=1; j<colspan; j++)
         	width[i]+=width[j];
    	html += '<td width="'+width[i]+'%" style="padding-left:2px;padding-right:2px;background-color:lightgray;" colspan="'+colspan+'">'+this.getHeaderCol(i)+'</td>';
         i+=colspan-1;
        }
      html += '</tr>';

	  	for (var i=2; i<this.hdr.rows.length; i++)
			html+="<tr>"+this.hdr.rows[i].innerHTML+"</tr>";

       for (var i=0; i<row_length; i++) {
         html += '<tr>';
           for (var j=0; j<col_length; j++) {
           	   var c=this.cells(this.rowsCol[i].idd, j);
           	   if (c.getImage) var value=c.cell.innerHTML;
           	   else var value = c.getValue();
                var color = this.columnColor[j]?'background-color:'+this.columnColor[j]+';':'';
            var align = this.cellAlign[j]?'text-align:'+this.cellAlign[j]+';':'';
            html += '<td style="padding-left:2px;padding-right:2px;'+color+align+'">'+(value===""?"&nbsp;":value)+'</td>';
           }
         html += '</tr>';
       }


	   if (this.ftr)
	  	for (var i=1; i<this.ftr.childNodes[0].rows.length; i++)
			html+="<tr>"+this.ftr.rows[i].innerHTML+"</tr>";

      html += '</table>';
      var d = window.open('', '_blank');
      d.document.write(html);
      d.document.close();
}
dhtmlXGridObject.prototype._printWidth=function(){
      var width = [];
      var total_width = 0;
      for (var i=0; i<this._cCount; i++) {
         var w = this.getColWidth(i);
         width.push(w);
         total_width += w;
      }
      var percent_width = [];
      var total_percent_width = 0;
      for (var i=0; i<width.length; i++) {
         var p = Math.floor((width[i]/total_width)*100);
         total_percent_width += p;
            percent_width.push(p);
      }
      percent_width[percent_width.length-1] += 100-total_percent_width;
      return percent_width;
   }
/**
*   @desc: load grid from javascript object
*   @param: obj - object
*   @type: notImplemented
*   @topic: 0
*/
dhtmlXGridObject.prototype.loadObject = function(obj){
}


/**
*   @desc: load grid from JSON file
*   @param: path - path to file
*   @type: notImplemented
*   @topic: 0
*/
dhtmlXGridObject.prototype.loadJSONFile = function(path){
}


/**
*   @desc: serialize to JSON object
*   @type: notImplemented
*   @topic: 0
*/
dhtmlXGridObject.prototype.serializeToObject = function(){
}

/**
*   @desc: serialize to JSON string
*   @type: notImplemented
*   @topic: 0
*/
dhtmlXGridObject.prototype.serializeToJSON = function(){
}

/*
user_pref("signed.applets.codebase_principal_support", true);
*/
if (!window.clipboardData)
window.clipboardData={
	_make:function(){
	   
	   var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
	   if (!clip) return null;
		
	   var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
	   if (!trans) return null;
	   		
	   trans.addDataFlavor('text/unicode');


	   var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
	   		
	   this._p=[clip,trans,str];
	   		
	   return true;
	},
	setData:function(type,text){
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
		if (!this._make()) return false;
		
   this._p[2].data=text;
   this._p[1].setTransferData("text/unicode",this._p[2],text.length*2);
   var clipid=Components.interfaces.nsIClipboard;
   this._p[0].setData(this._p[1],null,clipid.kGlobalClipboard);

	},
	getData:function(type){ 
	netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');		
		if (!this._make()) return false;


   this._p[0].getData(this._p[1],this._p[0].kGlobalClipboard);
   var strLength = new Object();
   var str = new Object();
   this._p[1].getTransferData("text/unicode",str,strLength);

	if (str) str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
	if (str) return str.data.substring(0,strLength.value / 2);

	return "";

	}
}



